package io.gitee.bowen_lee.netty.bowen.server;

import io.gitee.bowen_lee.netty.bowen.client.MyChannelHandle;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.ChannelHandler.Sharable;

/**
 * 通道处理器的桥梁!<br/>
 * 如果要去掉 BowenClientChannelHandle 类上的 共享注解（不去掉就要注意将类改为单例） 需要做一个桥梁 <br/>
 * 此类中每次注册都会new BowenClientChannelHandle() 这样就可以去掉共享注解<br/>
 * 但是、警告！.此类有个未完成bug 见类中的TODO<br/>
 * 
 * @author Bowen
 * @since 2022-01-13 15:42:31
 */
@Sharable
public class BowenBridgeClientChannelHandle extends ChannelInboundHandlerAdapter {

  @Override
  public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
    ChannelPipeline channelPipeline = ctx.pipeline();
    // 把 通道处理器 添加到 通道管道中
    // 这个地方是复用了 this 。可以单独创建 channelHandle 处理 读写，类似MyChannelHandle这样
    channelPipeline.addLast(new MyChannelHandle() {
      // TODO 此处代码应该是客户编写的业务代码。此类属于源码！ 所以不应该放在此处。
      // 思路： 使用 BiConsumer<T,V> 将业务代码块作为入参传递. (不写了，懒了)
      @Override
      public void println(ChannelHandlerContext ctx, String msgStr) {
        if ("hello world".equals(msgStr)) {
          System.out.println("回复 received!");
          ctx.writeAndFlush(Unpooled.copiedBuffer("received!".getBytes()));
        }
      }
    });
    // 当前 管道中在添加完MyChannelHandle 后,BowenBridgeClientChannelHandle失去价值,可去掉
    ctx.pipeline().remove(this);
  }

}
